package servlets;

import excecoes.NaoLogadoException;
import excecoes.ParametrosInvalidosException;
import excecoes.SaldoInsuficienteException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import negocio.Conta;
import negocio.Operacao;

@WebServlet(value="/saque")
public class SaqueServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ServletContext context = getServletContext();
        HttpSession session = request.getSession();
        
        Conta conta = (Conta) session.getAttribute("conta");
        if (conta == null) {
            throw new NaoLogadoException("Não existe conta-corrente conectada!");
        }
        
        try {
            char tipo = 'D';
            GregorianCalendar data = new GregorianCalendar();
            double valor = Double.parseDouble(request.getParameter("valor"));

            if (valor != 0) {
                if (conta.getSaldo() - valor >= 0) {
                    ArrayList<Operacao> operacoes = (ArrayList<Operacao>) context.getAttribute("operacoes");
                    if (operacoes == null) {
                        operacoes = new ArrayList<Operacao>();
                        context.setAttribute("operacoes", operacoes);
                    }

                    operacoes.add(new Operacao(conta, data, tipo, valor));
                    conta.setSaldo(conta.getSaldo() - valor);

                    response.sendRedirect("saque_sucesso.html");
                } else {
                    throw new SaldoInsuficienteException("Saldo da conta insuficiente!");
                }
            } else {
                throw new ParametrosInvalidosException("Parâmetros do saque inválidos!");
            }
        } catch(NumberFormatException e) {
            throw new ParametrosInvalidosException("Parâmetros do saque inválidos!");
        }
    }
    
}